import { ref, watch } from 'vue';
import { tryOnUnmounted } from '@vueuse/core';
import { isFunction } from '/@/utils/is';

export function useTimeoutFn(handle: Fn<any>, wait: number, native = false) {
   if (!isFunction(handle)) {
      throw new Error('handle is not Function!');
   }

   const { readyRef, stop, start } = useTimeoutRef(wait);
   if (native) {
      handle();
   } else {
      watch(
         readyRef,
         (maturity) => {
            maturity && handle();
         },
         { immediate: false },
      );
   }
   return { readyRef, stop, start };
}

export function useTimeoutRef(wait: number) {
   const readyRef = ref(false);

   let timer: TimeoutHandle;
   function stop(): void {
      readyRef.value = false;
      timer && window.clearTimeout(timer);
   }
   function start(): void {
      stop();
      timer = setTimeout(() => {
         readyRef.value = true;
      }, wait);
   }

   start();

   tryOnUnmounted(stop);

   return { readyRef, stop, start };
}
